
/* $Id: listanomi.c 8 2009-12-27 16:54:50Z calicant $ */

#include "edilana.h"

/*
 *  Stampa la lista dei nomi;
 *  ogni nome e' preceduto da un numero per la selezione;
 *  se "cerca" e' attivo, si stampano soltanto i nomi contenenti "s".
 */
static void VediListaNomi (
	struct FirmaNome *np[],
	int  numnomi,
	char *s,
	int  cerca
){
register int i;
int 	maxl = 0, l;
char	buff[MAXSTRLEN];
FILE 	*outlista;


        if ((outlista = IOFile(TEMPFILE,"w")) == NULL)
		return;

	if (cerca) Stripnl(s);

	for (i = 0; i < numnomi; i++) {
		if (cerca)
			if (strstr(np[i]->nome,s) == NULL) continue;
                if ((l = strlen(np[i]->nome)) > maxl) maxl = l;
		sprintf(buff,"%03d %s\n",i+1,np[i]->nome);
		fputs(buff,outlista);
	}
	fclose(outlista);

	if (!maxl) IoDico(TROVATO_POCO);
	else StampaCol(TEMPFILE,1,&l,maxl+4,OFF,OFF,s);

}

static int SottrazC (int tab[], int tab2[])
{
register int i;

	for (i = 0; i<NUMALFA; i++)
		if (tab[i]-tab2[i] < 0) return -1;

return 0;
}

int NomiBuoni (char *lemma, struct FirmaNome *np[], int numnomi)
{
char	buff[MAXSTRLEN];
int 	tab [NUMALFA];
int	i, maxl = 0, l;
FILE    *outlista;

	if (StringaBase(lemma,tab) < 3 || !numnomi) {
		if (!numnomi) IoDico(NON_NOMI);
		else IoDico(TROPPO_CORTO);
		return 0;
	}

	if ((outlista = IOFile(NOMENOMIB,"w")) == NULL)
		return 0;

	for (i = 0; i < numnomi; i++)
		if (!SottrazC(np[i]->tabe,tab)) {
                        l = strlen(np[i]->nome);
			if (l > maxl) maxl = l;
			sprintf(buff,"%03d %s\n",i+1,np[i]->nome);
			fputs(buff,outlista);
		}
	fclose(outlista);
	printf("\n");
	if (maxl)
		StampaCol(NOMENOMIB,1,tab,maxl+4,OFF,OFF,buff);
	else IoDico(TROVATO_POCO);

return maxl;
}

int UsaListaNomi (
	struct	FirmaNome *np[],
	int	*Nomi,
	char	*sott,
	char	com[]
){
int i;

	Stripnl(sott);

	if (sott[1] == *sott) {
		if (AbbastanzaLunga(sott,1))
			*Nomi = CostruisciTabella(np,&sott[2],*Nomi,
				MAXNOMI);
	}
	else if (*Nomi) {
		if (sott[1] == '\0')
			VediListaNomi(np,*Nomi,"",OFF);
		else if (isalpha(sott[1]))
			VediListaNomi(np,*Nomi,&sott[1],ON);
		else if ((i = Stringa2Cifra(sott,*Nomi)) >= 0) {
			*sott = com[NUOVA_BASE];
			sott[1] = '\0';
			strcat(sott,np[i]->nome);
/*
			if (stampa)
				printf(" *** nuova base: \"%s\"\n\n",
					np[i]->nome);
*/
			return -1;
		}
	} 
	else 
		IoDico(NON_NOMI);
return 0;
}
